home *** CD-ROM | disk | FTP | other *** search
- ;/* CloneWB.c - V36 Clone Workbench screen. Compiled with SAS/C 6.56
- sc NMINC STRMERGE STREQ NOSTKCHK SAVEDS IGNORE=73 LINK CloneWB.c
- quit
-
- Copyright (c) 1990-1999 Amiga, Inc.
-
- This example is provided in electronic form by Amiga, Inc.
- for use with the Amiga Mail Volume II technical publication.
- Amiga Mail Volume II contains additional information on the correct
- usage of the techniques and operating system functions presented in
- these examples. The source and executable code of these examples may
- only be distributed in free electronic form, via bulletin board or
- as part of a fully non-commercial and freely redistributable
- diskette. Both the source and executable code (including comments)
- must be included, without modification, in any copy. This example
- may not be published in printed form or distributed with any
- commercial product. However, the programming techniques and support
- routines set forth in these examples may be used in the development
- of original executable software products for Amiga
- computers.
-
- All other rights reserved.
-
- This example is provided "as-is" and is subject to change; no
- warranties are made. All use is at your own risk. No liability or
- responsibility is assumed.
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <intuition/intuition.h>
- #include <intuition/screens.h>
- #include <graphics/displayinfo.h>
-
- #include <clib/exec_protos.h>
- #include <clib/intuition_protos.h>
- #include <clib/graphics_protos.h>
-
- #include <pragmas/exec_pragmas.h>
- #include <pragmas/intuition_pragmas.h>
- #include <pragmas/graphics_pragmas.h>
-
- struct IntuitionBase *IntuitionBase;
- struct GfxBase *GfxBase;
- extern struct Library *SysBase;
-
- struct EasyStruct failedES = {
- sizeof(struct EasyStruct), 0, "CWB",
- "%s",
- "OK",
- };
-
- void main(void);
-
- void
- main(void)
- {
- struct Screen *wbscreen;
- struct Screen *clonescreen;
- struct Window *window;
- struct ViewPort *vp;
- struct IntuiMessage *msg;
- ULONG modeID;
-
- struct DisplayInfo displayinfo;
- struct MonitorInfo monitorinfo;
- struct DimensionInfo dimensioninfo;
- struct NameInfo nameinfo;
- struct DrawInfo *drawinfo;
-
- ULONG result;
-
- /* Fails silently when not V36 */
- if (IntuitionBase = OpenLibrary("intuition.library", 36)) {
- if (GfxBase = OpenLibrary("graphics.library", 36)) {
-
- if (wbscreen = LockPubScreen("Workbench")) {
- /* Using intuition.library/GetScreenDrawInfo(), we get the pen
- * array we'll use for the screen clone the easy way. */
- drawinfo = GetScreenDrawInfo(wbscreen);
-
- vp = &(wbscreen->ViewPort);
- /* Use graphics.library/GetVPModeID() to get the ModeID of the
- * Workbench screen. */
- if ((modeID = GetVPModeID(vp)) != INVALID_ID) {
- /* OK, we got a valid ModeID for the Workbench
- * screen (surprise) */
-
- /* With just the ModeID, the lock on the Workbench
- * screen & drawinfo->dri_Pens we're able to clone the
- * Workbench exactly, displaymode and all. When you want
- * to know everything there is to know about this
- * displaymode, use graphics.library/GetDisplayInfoData().
- */
- /* 'result' is the actual # of bytes copies
- * into the buffer.
- * See graphics/displayinfo.h for definitions
- * of the various structures.
- */
- result = GetDisplayInfoData(NULL,
- (UBYTE *)&monitorinfo,
- sizeof(struct MonitorInfo),
- DTAG_MNTR, modeID);
- result = GetDisplayInfoData(NULL,
- (UBYTE *)&displayinfo,
- sizeof(struct DisplayInfo),
- DTAG_DISP, modeID);
- result = GetDisplayInfoData(NULL,
- (UBYTE *)&dimensioninfo,
- sizeof(struct DimensionInfo),
- DTAG_DIMS,
- modeID);
- result = GetDisplayInfoData(NULL,
- (UBYTE *)&nameinfo,
- sizeof(struct NameInfo),
- DTAG_NAME,
- modeID);
-
- /* If you don't want to clone the workbench exactly,
- * you could use one of the other overscan modes
- * and/or min/max.
- * dimensions in dimensioninfo or open a regular screen.
- */
- if (clonescreen = OpenScreenTags(NULL,
- /* Could use STDSCREENWIDTH/HEIGHT for non-scrollable
- * screens. Those make */
- SA_Width, wbscreen->Width,
-
- /* OpenScreen() use the textoverscan values */
- SA_Height, wbscreen->Height,
-
- SA_DisplayID, modeID,
-
- SA_Depth, wbscreen->BitMap.Depth,
-
- /*Workbench always sizes up to OSCAN_TEXT, so do we */
- SA_Overscan, OSCAN_TEXT,
-
- SA_Pens, drawinfo->dri_Pens,
-
- SA_Title, nameinfo.Name,
-
- /* Doesn't hurt for screens which don't scroll */
- SA_AutoScroll, TRUE,
-
- TAG_END)) {
-
- if (window = OpenWindowTags(NULL,
- WA_Top, clonescreen->BarHeight + 1,
- WA_Height, clonescreen->Height
- - (clonescreen->BarHeight + 1),
- WA_CustomScreen, clonescreen,
- WA_MinWidth, 320,
- WA_MinHeight, 100,
- WA_MaxWidth, clonescreen->Width,
- WA_MaxHeight, clonescreen->Height,
-
- /* I'm only interested in CLOSEWINDOW messages */
- WA_IDCMP, CLOSEWINDOW,
- WA_Flags, WINDOWSIZING|WINDOWDRAG|
- WINDOWDEPTH|WINDOWCLOSE|ACTIVATE,
- WA_Title, "Close to exit.",
- TAG_END)) {
-
- /* Wait for the closewindow message */
- WaitPort(window->UserPort);
- /* And remove message from the port */
- while(msg = (struct IntuiMessage *)
- GetMsg(window->UserPort))
- ReplyMsg((struct Message *)msg);
- CloseWindow(window);
- } else
- EasyRequest(NULL, &failedES, NULL,
- "Can't open window");
- CloseScreen(clonescreen);
- } else
- EasyRequest(NULL, &failedES, NULL,
- "Can't open screen");
- } else
- EasyRequest(NULL, &failedES, NULL, "Invalide ModeID");
- FreeScreenDrawInfo(wbscreen, drawinfo);
- UnlockPubScreen(NULL, wbscreen);
- } else
- EasyRequest(NULL, &failedES, NULL,
- "Can't lock Workbench screen");
- CloseLibrary(GfxBase);
- }
- CloseLibrary(IntuitionBase);
- }
- }
-